package top.mccsdl.Acbot.utils;

import java.security.SecureRandom;
import java.util.HashSet;
import java.util.Set;

/**
 * 随机数工具类
 */
public class RandomUtil {
	/***0-99之间取5个不重复随机数 */
	public final static Set<Integer> FIVE_RANDOMSET_INT = randomIntSet(1, 29, 5, 5, null);
	/***0-99之间取10个不重复随机数 */
	public final static Set<Integer> TEN_RANDOMSET_INT = randomIntSet(0, 99, 10, 10, null);
	/***0-99之间取15个不重复随机数 */
	public final static Set<Integer> FIFTEEN_RANDOMSET_INT = randomIntSet(0, 99, 15, 15, null);
	/***0-99之间取20个不重复随机数 */
	public final static Set<Integer> TWENTY_RANDOMSET_INT = randomIntSet(0, 99, 20, 20, null);
	/***0-99之间取30个不重复随机数 */
	public final static Set<Integer> THIRTY_RANDOMSET_INT = randomIntSet(0, 99, 30, 30, null);
	/***0-99之间取40个不重复随机数 */
	public final static Set<Integer> FORTY_RANDOMSET_INT = randomIntSet(0, 99, 40, 40, null);
	/***0-99之间取80个不重复随机数 */
	public final static Set<Integer> EIGHTY_RANDOMSET_INT = randomIntSet(0, 99, 80, 80, null);


	/**
	 * 随机指定范围 ( 含头含尾)内N个不重复的整数
	 * 特性：利用HashSet的特征，只能存放不同的值
	 * 强烈建议m值与n值设定为一样的值
	 *
	 * @param min 	指定范围最小值
	 * @param max 	指定范围最大值
	 * @param m 	最终个数--用于指定最终结果个数
	 * @param n 	 随机数个数
	 * @param set 	递归Set
	 * @return HashSet<Integer> set 随机数结果集
	 */
	public static Set<Integer> randomIntSet(int min, int max, int m, int n, Set<Integer> set) {
		if (n > (max - min + 1) || max < min) {
			return null;
		}
		Set<Integer> retSet;
		if (set == null) {
			retSet = new HashSet<Integer>();
		} else {
			retSet = set;
		}
		for (int i = 0; i < n; i++) {
			// 调用Math.random()方法
			int num = randomInt(min, max);
			retSet.add(num);// 将不同的数存入HashSet中
		}
		int setSize = retSet.size();
		// 如果存入的数小于指定生成的个数，则调用递归再生成剩余个数的随机数，如此循环，直到达到指定大小
		if (setSize < m) {
			// 递归
			retSet = randomIntSet(min, max, m, m - setSize, retSet);
		}
		return retSet;
	}

	/**
	 * 随机指定范围内1个不重复的整数
	 * @param min 指定范围最小值
	 * @param max 指定范围最大值
	 * @return
	 */
	public static int randomInt(int min, int max) {
		// int num = (int) (Math.random() * (max - min + 1)) + min;
		// int num =  new Random().nextInt(max)%(max - min + 1)+ min;
		int num = new SecureRandom().nextInt(max - min + 1) + min;
		return num;
	}

	/**
	 * 随机0到Max范围内1个整数
	 * @param max	指定范围最大值，最小值为  0
	 * @return
	 */
	public static int randomInt(int max) {
		int num = new SecureRandom().nextInt(max + 1);
		return num;
	}

	/**
	 * 随机0到1范围内1个浮点数
	 */
	public static double randomDouble() {
		return new SecureRandom().nextDouble();
	}

	/**
	 * 随机0到1范围内1个浮点数
	 */
	public static boolean randomBoolean() {
		return new SecureRandom().nextBoolean();
	}

}
